#coding=utf-8
from PIL import Image
import numpy as np
from PIL import ImageFilter
import time
import matplotlib.pyplot as plt


def enlarge(left, top, right, bottom, append, image):
    if left - append > 0:
        left -= append
    else:
        left = 0
    if top - append > 0:
        top -= append
    else:
        top = 0
    if right + append < image.size[0]:
        right += append
    else:
        right = image.size[0]-1
    if bottom + append < image.size[1]:
        bottom += append
    else:
        bottom = image.size[1]-1
    return (left, top, right, bottom)

def findDigitalRegion(image):
    start = time.time()
    imageArray = np.array(image.getdata())
    imageArray = imageArray.reshape(image.size[1], image.size[0])
    # print imageArray.shape
    sumOfLines=[]
    for i in range(imageArray.shape[0]):
        value = sum(imageArray[i])
        if value > 255*2:
            sumOfLines.append(i)
    top = sumOfLines[0]
    bottom = sumOfLines[len(sumOfLines)-1]
    imageArray = imageArray.T
    print imageArray.shape
    sumOfLines = []
    for i in range(imageArray.shape[0]):
        value = sum(imageArray[i])
        if value > 255 * 2:
            sumOfLines.append(i)
    left = sumOfLines[0]
    right = sumOfLines[len(sumOfLines)-1]
    end = time.time()
    print str(end-start)+'s'
    # print imageArray.T.shape
    left, top, right, bottom = enlarge(left,top,right,bottom,100,image)
    plt.figure("digital")
    plt.subplot(1, 2, 1), plt.title('origin')
    plt.imshow(image), plt.axis('off')
    box = (left, top, right, bottom)
    roi = image.crop(box)
    plt.subplot(1, 2, 2), plt.title('roi')
    plt.imshow(roi), plt.axis('off')
    plt.show()
    return roi


def imageEnhance(image, maximum, minimum):
    """
    因为可能存在图像背景和数字灰度差别不大的缺点，为了克服缺点，需进行
    图像增强，使图像动态范围加大，图像更清晰，特征更明显
    :param image: 灰度图像
    :param maximum: 灰度图像最大像素值
    :param minimum: 灰度图像最大像素值
    :return:
    """
    # 灰度值修正 ......完成
    return image.point(lambda x: int((255 * 1.0 / (maximum - minimum)) * (x - minimum)))

def imageBinarization(image):
    """
    使用Image库中的函数二值化，会产生很多噪声点，为消除噪声点，这里使用模式滤波器，基本工作原理是
    对于输入图像的每个像素点，
    该滤波器从（size，size）的区域中拷贝出现次数最多的像素值存储到输出图像中。
    如果没有一个像素值出现过两次极其以上，则使用原始像素值。
    :param image: 灰度图像
    :return: 二值化图像
    """
    image = image.convert('1')
    image = image.filter(ImageFilter.ModeFilter(5))
    # im = im.filter(ImageFilter.ModeFilter(5))  #二次滤波，使得图片的边沿更加平滑
    # im = im.filter(ImageFilter.ModeFilter(3))  #三次滤波，使得图片的边沿更加平滑
    return image

def imageRefinement(image):
    pass
